package com.STS.ELearning.Classes
{	
	import com.STS.ELearning.DAO.Kategoriler;
	import com.STS.ELearning.DAO.Konular;
	import com.STS.ELearning.DAO.Sinavlar;
	import com.STS.ELearning.Events.Mesaj;
	import com.STS.ELearning.VO.KategorilerVO;
	import com.STS.ELearning.VO.KonularOnkonularVO;
	import com.STS.ELearning.VO.KonularVO;
	import com.STS.ELearning.VO.SinavlarVO;
	import com.coltware.airxzip.ZipEntry;
	import com.coltware.airxzip.ZipError;
	import com.coltware.airxzip.ZipEvent;
	import com.coltware.airxzip.ZipFileReader;
	import com.coltware.airxzip.ZipHeader;
	
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.OutputProgressEvent;
	import flash.events.SecurityErrorEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.geom.Utils3D;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	import flash.utils.ByteArray;
	import flash.utils.Endian;
	import flash.utils.setTimeout;
	import flash.xml.XMLDocument;
	
	import mx.collections.XMLListCollection;
	import mx.controls.Alert;
	import mx.messaging.channels.StreamingAMFChannel;
	import mx.messaging.events.MessageEvent;
	import mx.rpc.CallResponder;
	import mx.utils.StringUtil;
	import mx.utils.XMLUtil;
	
	[Event(name="DersEklemeIlerleme",type="mx.messaging.events.MessageEvent")]
	[Event(name="DersEklendi",type="mx.messaging.events.MessageEvent")]
	[Event(name="DersEklenemedi",type="mx.messaging.events.MessageEvent")]
	[Event(name="DosyalarCikarildi",type="mx.messaging.events.MessageEvent")]
	[Event(name="DosyaSifreli",type="mx.messaging.events.MessageEvent")]
	[Event(name="KonuEklenemedi",type="mx.messaging.events.MessageEvent")]
	[Event(name="KategoriEklenemedi",type="mx.messaging.events.MessageEvent")]
	[Event(name="SinavEklenemedi",type="mx.messaging.events.MessageEvent")]
	
	public class DersIslemleri extends Base
	{
		
		
		public static const EDersEklemeIlerleme:String="DersEklemeIlerleme";
		public static const EDersEklendi:String="DersEklendi";
		public static const EDersEklenemedi:String="DersEklenemedi";
		public static const EDosyalarCikarildi:String="DosyalarCikarildi";
		public static const EDosyaSifreli:String="DosyaSifreli";
		public static const EKonuEklenemedi:String="KonuEklenemedi";
		public static const EKategoriEklenemedi:String="KategoriEklenemedi";
		public static const ESinavEklenemedi:String="SinavEklenemedi";
		
		private var kat:Kategoriler=Kategoriler.getInstance();
		private var konu:Konular=Konular.getInstance();
		private var sin:Sinavlar=Sinavlar.getInstance();
		
		private static const DERSLERXML:String="Dersler.xml";
		private static const YUKLEME_KONUMU:String="DersDosyalari";
		private var ii:IndirmeIslemleri;
		public function DersIslemleri()
		{
			super();
		}
		
		
		
		public function DersEkle(f:File,r:URLRequest=null):void
		{
			
			if(r!=null)
			{
				ii=new IndirmeIslemleri();
				ii.addEventListener(IndirmeIslemleri.EDosyaIndirmeIlerleme,function(evt:MessageEvent):void{
					
					var x:Function=function():void{
						ii.removeEventListener(IndirmeIslemleri.EDosyaIndirmeIlerleme,(arguments.callee as Function));
						var evx:MessageEvent=new MessageEvent(EDersEklemeIlerleme,false,true,new Mesaj((parseInt(evt.messageId)).toString(),"İndiriliyor"));
						dispatchEvent(evx);
						if(evx.isDefaultPrevented())
						{
							evt.preventDefault();
						}
						ii.addEventListener(IndirmeIslemleri.EDosyaIndirmeIlerleme,(arguments.callee as Function));
					};
					x.call();
				});		
				ii.addEventListener(IndirmeIslemleri.EDosyaIndirildi,function(evt:MessageEvent):void{
					DersEkle(new File(evt.message.body[0]));
				});
				ii.addEventListener(IndirmeIslemleri.EDosyaIndirilemedi,function(evt:MessageEvent):void{
					var x:Function=function():void{
						ii.removeEventListener(IndirmeIslemleri.EDosyaIndirilemedi,(arguments.callee as Function));
						dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,(new Mesaj(evt.messageId,evt.message.body))));
						ii.addEventListener(IndirmeIslemleri.EDosyaIndirilemedi,(arguments.callee as Function));
					};
					x.call();
				});
				ii.downloadFile(f,r);
				return;
			}
			if(f!=null)
				DersCikar(f);
		}
		
		private function DersCikar(f:File):void
		{
			var xm:XML;
			var yuklemeKonumu:File=File.applicationDirectory.resolvePath(YUKLEME_KONUMU);
			yuklemeKonumu=new File(yuklemeKonumu.nativePath);
			var fs1:FileStream=new FileStream();
			try{
				fs1.open(new File(yuklemeKonumu.nativePath+"/temp.lock") ,FileMode.WRITE);
				fs1.writeUTFBytes("lock");
			}catch(err:Error)
			{
				fs1.close();
				dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,(new Mesaj("Ders Ekleyebilmek için programı yönetici haklarıyla çalıştırmalısınız.",f.nativePath))));
				return;
			}
			
			
			
			var zp:ZipFileReader=new ZipFileReader();
			
			var list:Array=new Array();;
			
				if(zp.check(f))
				{	
					try{
						zp.open(f);
						list=zp.getEntries();
					}catch(e:Error)
					{
						dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,(new Mesaj("Yüklemek istediğiniz dosyada geçerli bir yapılandırmaya sahip değil.\n(Geçersiz .tgb dosyası!)",f.nativePath))));
						return;	
					}
				}else
				{
					dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,(new Mesaj("Yüklemek istediğiniz dosyada geçerli bir yapılandırmaya sahip değil.\n(Geçersiz .tgb dosyası!)",f.nativePath))));
					return;
				}
			
			if(list.length>0)
			{
				aktifDersKlasoruAd=f.name.replace(("."+f.extension),"");
				aktifDersKlasoru=yuklemeKonumu=yuklemeKonumu.resolvePath(aktifDersKlasoruAd);
			}
			var ij:int=0;
			var cikacakDosyaSayisi:int=0;
			var cikanSayisi:int=0;
			zp.addEventListener(ZipEvent.ZIP_DATA_UNCOMPRESS,function(e:ZipEvent):void{
				var sf:File=yuklemeKonumu.resolvePath(e._entry.getFilename());	
				sf=new File(sf.parent.nativePath.toString()+"/"+sf.name);
				/*if(!sf.parent.exists)
				{
					sf.parent.createDirectory();
				}*/
				var fs:FileStream=new FileStream();
				fs.addEventListener(SecurityErrorEvent.SECURITY_ERROR,function(evt:SecurityErrorEvent):void{
					
					
					dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,new Mesaj("Dosya Çıkarma işlemi iptal edildi.Son çıkarılan dosya:"+e._entry.getFilename(),sf.nativePath)));				
				});
				fs.addEventListener(IOErrorEvent.IO_ERROR,function(evt:IOErrorEvent):void{
					dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,new Mesaj("Dosya Çıkarma işlemi iptal edildi.Son çıkarılan dosya:"+e._entry.getFilename(),sf.nativePath)));				
				});
				fs.addEventListener(Event.CLOSE,function(clE:Event):void{
					if(sf.name=="Dersler.xml")
					{
						DersiVeriTabaninaKaydet(sf.parent);
					}
				});			
				/*if(sf.exists)sf.deleteFile();*/
				fs.openAsync(sf,FileMode.WRITE);
				fs.writeBytes(e._data,0,e._data.length);
				fs.close();
				
				
				var exyz:MessageEvent=new MessageEvent(EDersEklemeIlerleme,false,true,new Mesaj(int(((++cikanSayisi)/cikacakDosyaSayisi)*100).toFixed(),e._entry.getFilename()+" dosyası çıkarıldı."));
				dispatchEvent(exyz);
				if(exyz.isDefaultPrevented()){
					e.preventDefault();
					zp.close();
					dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,new Mesaj("Dosya Çıkarma işlemi iptal edildi.Son çıkarılan dosya:"+e._entry.getFilename(),sf.nativePath)));
				}else if(cikanSayisi==cikacakDosyaSayisi){
					e.preventDefault();
					zp.close();
					dispatchEvent(new MessageEvent(EDersEklemeIlerleme,false,false,new Mesaj("100","Dosya Çıkarma İşlemi Tamamlandı")));
					
					
				}
			});
			zp.addEventListener(ZipEvent.ZIP_DATA_UNCOMPRESS_ASYNC_COMPLATE,function():void{
				zp.close();
			});
			
			for each(var en:ZipEntry  in list)
			{
				
				if(!en.isDirectory())
				{
					var fName:String=en.getFilename();
					var sifre:String=null;
					if(en.isEncrypted())
					{
						var evx:MessageEvent=new MessageEvent(EDosyaSifreli,false,true,new Mesaj("Dosyadaki içerik şifreli.",null));
						dispatchEvent(evx);
						if(!evx.isDefaultPrevented())//esgeç denmediyse
						{
							sifre=evx.messageId;
						}
					}
					if(sifre!=null)
						zp.setPassword(sifre);
					
					if(!en.isEncrypted() || sifre!=null)
						cikacakDosyaSayisi++//en azından ben öyle ümit ediyorum
					//dosya şifresi gonderimmiştir.
					
					zp.unzipAsync(en);
				}				
			}
			
		}
		
		
		
		private var aktifDersKlasoru:File;
		private var aktifDersKlasoruAd:String;
		public function DersiVeriTabaninaKaydet(k:File):void
		{
			aktifDersKlasoru=k.clone();
			var xmlf:File=k.resolvePath(DERSLERXML);
			xmlf=new File(xmlf.nativePath);
			var xm:XML;
			if(xmlf.exists && !xmlf.isDirectory && !xmlf.isSymbolicLink)
			{
				var fsx:FileStream=new FileStream();
				try{
					fsx.open(xmlf,FileMode.READ);
					xm=new XML(fsx.readUTFBytes(xmlf.size));
				}catch(ex:Error){
					dispatchEvent(new MessageEvent(EDersEklenemedi,false,false,(new Mesaj("Belirttiğiniz dosyada ki '"+DERSLERXML+"',geçerli bir yapılandırmaya sahip değil.",xmlf.nativePath))));
					return;
				}
			}
			if(xm!=null && xm.length()>0)
			{
				KategoriEkle(xm,xm,null);
			}
			IcerikYoneticisi.getInstance().updateMenu();
			dispatchEvent(new MessageEvent(EDersEklendi,false,false,new Mesaj("Ders Ekleme İşlemi Tamamlandı","")));
		}
		
		private function KategoriEkle( d:XML,xm:XML,pk:KategorilerVO=null):void
		{
			var katVo:KategorilerVO;
			katVo=new KategorilerVO(kat.getSingleRow("ad=@ad and idUstkategori="+(pk!=null?pk.id:0),[{name:"ad",value:d.@ad}]));
			if(katVo.id<=0)
			{
				katVo.ad=d.@ad;
				katVo.otarih=new Date();
			}
			katVo.aciklama=StringUtil.trim(d.@aciklama)!=""?katVo.aciklama:"";
			katVo.dtarih=new Date();
			katVo.sira=int(parseInt(d.@sira));
			katVo.idUstKategori=pk!=null?pk.id:0;
			katVo.surec=int(parseInt(d.@surec));
			if(katVo.id==0)
			{
				if(!kat.insertRow(katVo))
				{
					dispatchEvent(new MessageEvent(EKategoriEklenemedi,false,false,new Mesaj("Kategori eklenemedi")));
					return;
				}
			}else
			{
				kat.updateRow(katVo);
			}
			
			for each(var k:XML in d.konu)
			{
				konuEkle(k,katVo,d,xm);
			}
			for each(var s:XML in d.sinav)
			{
				SinavEkle(s,katVo,null)
			}
			for each(var u:XML in d.kategori)
			{
				KategoriEkle(u,xm,katVo);
			}
			
		}
		
		
		
		private function konuEkle(k:XML,katVo:KategorilerVO,katXml:XML,xm:XML):void
		{
			var konVo:KonularVO;
			konVo=new KonularVO(konu.getSingleRow("ad=@ad and idKategori=@idKategori",[{name:"ad",value:k.@ad},{name:"idKategori",value:katVo.id}]));
			if(konVo.id<=0)
			{
				konVo.idKategori=katVo.id;
				konVo.ad=k.@ad;
				konVo.otarih=new Date();
			}
			konVo.aciklama=StringUtil.trim(k.@aciklama)!="" ? konVo.aciklama:"";
			konVo.dtarih=new Date();
			konVo.sira=int(parseInt(k.@sira));
			konVo.surec=int(parseInt(k.@surec));
			konVo.idKullanici=IcerikYoneticisi.getInstance().Kullanici.id;
			konVo.metin=(k.icerik.@metinyol!=null && StringUtil.trim(k.icerik.@metinyol)!="")?YUKLEME_KONUMU+"\\"+ aktifDersKlasoruAd+"\\"+StringUtil.trim(k.icerik.@metinyol):"";
			konVo.video=(k.icerik.@videoyol!=null && StringUtil.trim(k.icerik.@videoyol)!="")?YUKLEME_KONUMU+"\\"+ aktifDersKlasoruAd+"\\"+StringUtil.trim(k.icerik.@videoyol):"";
			if(konVo.id<=0)
			{
				if(!konu.insertRow(konVo))
				{
					dispatchEvent(new MessageEvent(EKategoriEklenemedi,false,false,new Mesaj("Konu eklenemedi.",konVo)));
					return;
				}
			}else
			{
				konu.updateRow(konVo);
			}
			
			konu.OnKonulariSil(konVo.id);
			
	disloop:for each(var onk:XML in k.onkonular.konu)
			{
					var stronk:String=(onk.@yol as String);
					stronk=StringUtil.trim(stronk)
					if(stronk!=null && stronk!="")
					{
						var arrbag:Array=stronk.split("#");
						var xkk:KonularVO;
						var parentKat:KategorilerVO;
						var curParId:int=0;
				icloop:for(var kj:int=0;kj<arrbag.length-2;kj++)
						{
							parentKat=new KategorilerVO(kat.getSingleRow("idUstkategori=@idUstKategori and ad=@ad",
								[{name:"idUstKategori",value:curParId},{name:"idUstKategori",value:arrbag[kj]}]));
							if(parentKat.id==0)
							{
								break icloop;
							}else
								curParId=parentKat.id;
						}
						xkk=new KonularVO(konu.getSingleRow("idKategori=@idKategori and ad=@ad",
							[{name:"idKategori",value:curParId},{name:"ad",value:arrbag[arrbag.length-1]}]));
						if(xkk.id>0)
							konu.onKonuEkle(new KonularOnkonularVO({idKonu:konVo.id,idOnkonu:xkk.id}));
					}
			}//onkonular eklendi
			
			for each(var xsin:XML in k.sinav)
			{
				SinavEkle(xsin,katVo, konVo);
			}
		}
		
		private function SinavEkle(xsin:XML,katVo:KategorilerVO, konVo:KonularVO=null):void
		{
			var sinav:SinavlarVO;
			if(konVo!=null && konVo.id>0)
			{
				sinav=new SinavlarVO(sin.getSingleRow("idkonu=@idkonu and ad=@ad",
				[{name:"idkonu",value:konVo.id},{name:"ad",value:xsin.@ad}]));
			}else
			{
				sinav=new SinavlarVO(sin.getSingleRow("idkategori=@idkategori and ad=@ad",
					[{name:"idkategori",value:katVo.id},{name:"ad",value:xsin.@ad}]));
			}
			if(sinav==null || sinav.id<=0)
			{
				sinav.ad=xsin.@ad;
				sinav.otarih=new Date();
			}
			sinav.idkonu=konVo!=null?konVo.id:0;
			sinav.idkategori=katVo.id;
			sinav.dtarih=new Date();
			sinav.herkeseAcik=true;//şimdilik;
			sinav.idKullanici=IcerikYoneticisi.getInstance().Kullanici.id;
			sinav.maxUygulamaSayisi=int(parseInt(xsin.@maxuygulamasayisi));
			sinav.sira=int(parseInt(xsin.@sira));
			sinav.zorluk=int(parseInt(xsin.@zorluk));
			sinav.sinavyol=(xsin.@yol!=null && StringUtil.trim(xsin.@yol)!="")?YUKLEME_KONUMU+"\\"+ aktifDersKlasoruAd+"\\"+StringUtil.trim(xsin.@yol):"";
			
			if(sinav.id<=0)
			{
				sin.insertRow(sinav);
				dispatchEvent(new MessageEvent(ESinavEklenemedi,false,false,new Mesaj("Sinav eklenemedi.",sinav)));
				return;
			}
			else
			{
				sin.updateRow(sinav);
			}
		
		}
		
	
		
		
		
		
		public static var DerslerTreeXML:String;
		public function derslerXmlString(isNew:Boolean):String
		{
			if(isNew)
				DersIslemleri.DerslerTreeXML=null;
			if(DersIslemleri.DerslerTreeXML==null)
			{
				var kats:Array=kat.getTableContent();
				var konus:Array=konu.getTableContent();
				var sins:Array=sin.getTableContent();
				DerslerTreeXML=  '<root>'
				+DersNodu(0,kats,konus,sins)
				+'</root>';
			}
			return DerslerTreeXML;
		}
		
		
		private function DersNodu(ustId:int,kats:Array,konus:Array,sins:Array): String
		{
			var ret:String="";
			var arr:Array=kats.filter(function(item:*,index:int,a:Array):Boolean{
					if(item.idUstKategori==ustId)
						return true;
					return false;
			});
			for each(var itm:KategorilerVO in arr)
			{
				ret+='<node label="'+Helper.xmlEncode(itm.ad)+'" toolTip="'+Helper.xmlEncode(itm.aciklama)+'"  data="'+itm.id+'"  type="kategori">'
					+ KonuNodu(itm.id,konus,sins)
					+ DersNodu(itm.id,kats,konus,sins)
					+ SinavNodu(itm.id,0,sins)
					+'</node>';
			}
			return ret;
			
		}
		
		private function KonuNodu(idKat:int,konus:Array,sins:Array): String
		{
			var ret:String="";
			var arr:Array=konus.filter(
				function(item:*,index:int,a:Array):Boolean{
					if(item.idKategori==idKat)
						return true;
					return false;
				});
			for each(var itm:KonularVO in arr)
			{
				ret+='<node label="Konu:'+Helper.xmlEncode(itm.ad)+'"  icon="dersIcon" toolTip="'+Helper.xmlEncode(itm.aciklama)+'"   data="'+itm.id+'"  type="konubaslik">';
				if(itm.video!="")
					ret+='<node label="Görüntülü Ders İçeriği" icon="videoIcon" toolTip="'+Helper.xmlEncode(itm.aciklama)+' Konusu ile ilgili yazılı ve göresel dersler"   data="'+itm.id+'"  type="video"/>';
				if(itm.metin!="")
					ret+='<node label="Pdf Ders İçeriği" icon="metinIcon" toolTip="'+Helper.xmlEncode(itm.aciklama)+' Konusu ile ilgili yazılı ve göresel dersler"   data="'+itm.id+'"  type="metin"/>';
				
				ret+=SinavNodu(idKat,itm.id,sins);
				ret+='</node>';
			}
			return ret;
		}
		private function SinavNodu(idKat:int,idKonu:int,sins:Array): String
		{
			var ret:String="";
			if(sins==null) return ret;
			var arr:Array=sins.filter(
			function(item:*,index:int,a:Array):Boolean{
					if(item!=null && (item.idkategori==idKat) && ((item.idkonu!=0  && item.idkonu==idKonu) || (idKonu==0  && item.idkonu==0)))
					return true;
				return false;
			});
		
			for each(var itm:* in arr)
			{
				ret+='<node label="Sınav:'+Helper.xmlEncode(itm.ad) +'"  icon="sinavIcon"  toolTip="'+Helper.xmlEncode(itm.ad)+' Sınavı" data="'+itm.id+'"  type="sinav"/>';
			}
			
			return ret;
		}
		
		public function GetKonuVideo(id:int):KonularVO
		{
			return	new KonularVO(konu.getSingleRow("id=@id",[{name:"id",value:id}]));
		}
		
		public function GetSinavVideo(id:int):SinavlarVO
		{
			return	new SinavlarVO(sin.getSingleRow("id=@id",[{name:"id",value:id}]));
		
		}
	}
}